/**
 * \file CColumnModel.h
 * \author Corentin Le Bail
 * \date 2009-2011
 * \brief Fichier de déclaration des classes de modèle de colonne.
 */
//------------------------------------------------------------------------------
#ifndef __CCOLUMNMODEL_H__
#define __CCOLUMNMODEL_H__
//------------------------------------------------------------------------------
#include <QString>
#include <QIcon>
#include <QDate>
#include <QTime>
#include <QVariant>
//------------------------------------------------------------------------------
typedef bool (*TValidator)(QString text); //!< typedef
//------------------------------------------------------------------------------
/**
 * \class CColumnModel CColumnModel.h "CColumnModel.h"
 * \brief Classe de base des modèles de colonne
 */
class CColumnModel : public QObject
{
	Q_OBJECT
	public:
		/**
		* \fn CColumnModel(int numChamp, QString nomChamp, QString title, Qt::Alignment alignment=Qt::AlignLeft, QIcon *icon=0, 	 Qt::ItemFlags flags=(Qt::ItemFlags)63, QVariant data=QVariant(), QVariant::Type type=QVariant::String)
		 * \brief Constructeur
		 * \param[in] numChamp Numéro du champ dans la table de la base de données
		 * \param[in] nomChamp Nom du champ dans la table de la base de données
		 * \param[in] title Nom de la colonne
		 * \param[in] alignment Alignement dans la table
		 * \param[in] icon Image
		 * \param[in] flags Drapeau de configuration
		 * \param[in] data Donnée interne
		 * \param[in] type Type de données
		 */
		CColumnModel(	int numChamp, QString nomChamp, QString title, Qt::Alignment alignment=Qt::AlignLeft, 
						QIcon *icon=0, 	 Qt::ItemFlags flags=(Qt::ItemFlags)63, QVariant data=QVariant(), QVariant::Type type=QVariant::String);
		/**
		 * \fn virtual ~CColumnModel(void)
		 * \brief Destructeur
		 */
		virtual ~CColumnModel(void) {}
		/**
		 * \fn int getNumChamp(void)
		 * \return Le numéro du champ dans la table de la base de données
		 */
		int getNumChamp(void) { return _numChamp; }
		/**
		 * \fn int getNomChamp(void)
		 * \return Le nom du champ dans la table de la base de données
		 */
		QString getNomChamp(void) { return _nomChamp; }
		/**
		 * \fn Qt::Alignment getAlignment(void)
		 * \return L'alignement dans la table
		 */
		Qt::Alignment getAlignment(void) { return _alignment; }
		/**
		 * \fn QIcon * getIcon(void)
		 * \return L'image de la colonne dans la table
		 */
		QIcon * getIcon(void) { return _icon; }
		/**
		 * \fn Qt::ItemFlags getFlags(void)
		 * \return Le drapeau de configuration de la colonne
		 */
		Qt::ItemFlags getFlags(void) { return _flags; }
		/**
		 * \fn void setFlags(Qt::ItemFlags flags)
		 * \param[in] flags le drapeau de configuration de la colonne
		 */
		void setFlags(Qt::ItemFlags flags) { _flags=flags; }
		/**
		 * \fn void setValidator(TValidator validator)
		 * \brief Affecte la méthode de validation de la colonne
		 * \param[in] validator La méthode de validation de la colonne
		 */
		void setValidator(TValidator validator) { _validator=validator; }
		/**
		 * \fn TValidator getValidator(void)
		 * \return La méthode de validation de la colonne
		 */
		TValidator getValidator(void) { return _validator; }
		/**
		 * \fn void setOldValue(QString oldValue)
		 * \brief Affecte la valeur "d'avant"
		 * \param[in] oldValue La valeur "d'avant"
		 */
		void setOldValue(QString oldValue) { _oldValue=oldValue; }
		/**
		 * \fn QString getOldValue(void)
		 * \return La valeur "d'avant"
		 */
		QString getOldValue(void) { return _oldValue; }
		/**
		 * \fn void setDefaultValue(QString defaultValue)
		 * \brief Affecte la valeur par défaut
		 * \param[in] defaultValue La valeur par défaut
		 */
		void setDefaultValue(QString defaultValue) { _defaultValue=defaultValue; }
		/**
		 * \fn QString getDefaultValue(void)
		 * \return La valeur par défaut
		 */
		QString getDefaultValue(void) { emit queryDefaultValue(); return  _defaultValue; }
		/**
		 * \fn void setType(QVariant::Type type)
		 * \brief Affecte le type de la colonne
		 * \param[in] type Le type de la colonne
		 */
		void setType(QVariant::Type type) { _type=type; }
		/**
		 * \fn QVariant::Type getType(void)
		 * \return Le type de la colonne
		 */
		QVariant::Type getType(void) { return _type; }
		/**
		 * \fn QString getTitre(void)
		 * \return Le titre de la colonne
		 */
		QString getTitre(void) { return _titre; }
		/**
		 * \fn QVariant getData(void)
		 * \return Les données interne
		 */
		QVariant getData(void) { return _data; }
		/**
		 * \fn void setData(QVariant data)
		 * \brief Affecte les données interne
		 * \param[in] data Les données interne
		 */
		void setData(QVariant data) { _data=data; }
		/**
		 * \fn virtual QString format(QString string)
		 * \param[in] string Formate la chaine string pour l'afficher dans la grille
		 * \return La chaine formaté
		 */
		virtual QString format(QString string) = 0;
		/**
		 * \fn virtual QString formatToSQL(QString string)
		 * \param[in] string Formate la chaine string en SQL
		 * \return La chaine formaté
		 */
		virtual QString formatToSQL(QString string) = 0;
		/**
		 * \fn virtual QString formatFromSQL(QString string)
		 * \param[in] string Formate la chaine string depuis une chaine SQL
		 * \return La chaine formaté
		 */
		virtual QString formatFromSQL(QString string) = 0;
	private:
		int _numChamp;
		QString _nomChamp;
		QString _titre;
		Qt::Alignment _alignment;
		QIcon *_icon;
		Qt::ItemFlags _flags;
		TValidator _validator;
		QString _oldValue;
		QVariant::Type _type;
	protected:
		QVariant _data; //!< Donnée interne
		QString _defaultValue; //!< Valeur par défaut
	signals:
		/**
	 	 * \fn void queryDefaultValue(void)
		 * \brief Signal de demande de valeur par défaut
		 */
		void queryDefaultValue(void);
};
//------------------------------------------------------------------------------
/**
 * \class CColumnModelString CColumnModel.h "CColumnModel.h"
 * \brief Classe de base des modèles de colonne pour les valeurs de type chaine de caractères
 */
class CColumnModelString : public CColumnModel
{
	Q_OBJECT
	public:
		/**
		* \fn CColumnModelString(	int numChamp, QString nomChamp, QString titre, Qt::Alignment alignment=Qt::AlignLeft, QIcon 	*icon=0, 	 Qt::ItemFlags flags=(Qt::ItemFlags)63, QVariant data=QVariant())
		 * \brief Constructeur
		 * \param[in] numChamp Numéro du champ dans la table de la base de données
		 * \param[in] nomChamp Nom du champ dans la table de la base de données
		 * \param[in] titre Titre de la colonne
		 * \param[in] alignment Alignement dans la table
		 * \param[in] icon Image
		 * \param[in] flags Drapeau de configuration
		 * \param[in] data Donnée interne
		*/
		CColumnModelString(	int numChamp, QString nomChamp, QString titre, Qt::Alignment alignment=Qt::AlignLeft, 
							QIcon *icon=0, Qt::ItemFlags flags=(Qt::ItemFlags)63, QVariant data=QVariant());
		QString format(QString string) { return string; }
		QString formatToSQL(QString string) { return "\""+string+"\""; }
		QString formatFromSQL(QString string) { return string; }
};
//------------------------------------------------------------------------------
/**
 * \class CColumnModelInt CColumnModel.h "CColumnModel.h"
 * \brief Classe de base des modèles de colonne pour les valeurs de type entier
 */
class CColumnModelInt : public CColumnModel
{
	Q_OBJECT
	public:
		/**
		* \fn CColumnModelInt(	int numChamp, QString nomChamp, QString titre, Qt::Alignment alignment=Qt::AlignRight, QIcon *icon=0, 	 Qt::ItemFlags flags=(Qt::ItemFlags)63, QVariant data=QVariant())
		 * \brief Constructeur
		 * \param[in] numChamp Numéro du champ dans la table de la base de données
		 * \param[in] nomChamp Nom du champ dans la table de la base de données
		 * \param[in] titre Titre de la colonne
		 * \param[in] alignment Alignement dans la table
		 * \param[in] icon Image
		 * \param[in] flags Drapeau de configuration
		 * \param[in] data Donnée interne
		 */
		CColumnModelInt(	int numChamp, QString nomChamp, QString titre, Qt::Alignment alignment=Qt::AlignRight, 
							QIcon *icon=0, Qt::ItemFlags flags=(Qt::ItemFlags)63, QVariant data=QVariant());
		QString format(QString string) { return QString::number(string.toInt()); }
		QString formatToSQL(QString string) { return format(string); }
		QString formatFromSQL(QString string) { return format(string); }
};
//------------------------------------------------------------------------------
/**
 * \class CColumnModelDouble CColumnModel.h "CColumnModel.h"
 * \brief Classe de base des modèles de colonne pour les valeurs de type réel
 */
class CColumnModelDouble : public CColumnModel
{
	Q_OBJECT
	public:
		/**
		* \fn CColumnModelDouble(	int numChamp, QString nomChamp, QString titre, Qt::Alignment alignment=Qt::AlignRight, QIcon *icon=0, 	 Qt::ItemFlags flags=(Qt::ItemFlags)63, QVariant data=QVariant())
		 * \brief Constructeur
		 * \param[in] numChamp Numéro du champ dans la table de la base de données
		 * \param[in] nomChamp Nom du champ dans la table de la base de données
		 * \param[in] titre Titre de la colonne
		 * \param[in] alignment Alignement dans la table
		 * \param[in] icon Image
		 * \param[in] flags Drapeau de configuration
		 * \param[in] data Donnée interne
		 */
		CColumnModelDouble(	int numChamp, QString nomChamp, QString titre, Qt::Alignment alignment=Qt::AlignRight, 
							QIcon *icon=0, Qt::ItemFlags flags=(Qt::ItemFlags)63, QVariant data=QVariant());
		QString formatToSQL(QString string) { return format(string); }
		QString format(QString string);
		QString formatFromSQL(QString string) { return format(string); }
};
//------------------------------------------------------------------------------
/**
 * \class CColumnModelDate CColumnModel.h "CColumnModel.h"
 * \brief Classe de base des modèles de colonne pour les valeurs de type date
 */
class CColumnModelDate : public CColumnModel
{
	Q_OBJECT
	public:
		/**
		* \fn CColumnModelDate(	int numChamp, QString nomChamp, QString titre, Qt::Alignment alignment=Qt::AlignLeft, QIcon *icon=0, 	 Qt::ItemFlags flags=(Qt::ItemFlags)63, QVariant data=QVariant())
		 * \brief Constructeur
		 * \param[in] numChamp Numéro du champ dans la table de la base de données
		 * \param[in] nomChamp Nom du champ dans la table de la base de données
		 * \param[in] titre Titre de la colonne
		 * \param[in] alignment Alignement dans la table
		 * \param[in] icon Image
		 * \param[in] flags Drapeau de configuration
		 * \param[in] data Donnée interne
		 */
		CColumnModelDate(	int numChamp, QString nomChamp, QString titre, Qt::Alignment alignment=Qt::AlignLeft, 
							QIcon *icon=0, Qt::ItemFlags flags=(Qt::ItemFlags)63, QVariant data=QVariant());
		QString format(QString string) { return QDate::fromString(string, "dd/MM/yyyy").toString("dd/MM/yyyy"); }
		QString formatToSQL(QString string) { return "\""+QDate::fromString(string, "dd/MM/yyyy").toString("yyyy-MM-dd")+"\""; }
		QString formatFromSQL(QString string) { return QDate::fromString(string, "yyyy-MM-dd").toString("dd/MM/yyyy"); }
};
//------------------------------------------------------------------------------
/**
 * \class CColumnModelTime CColumnModel.h "CColumnModel.h"
 * \brief Classe de base des modèles de colonne pour les valeurs de type date
 */
class CColumnModelTime : public CColumnModel
{
	Q_OBJECT
	public:
		/**
		* \fn CColumnModelTime(	int numChamp, QString nomChamp, QString titre, Qt::Alignment alignment=Qt::AlignRight, QIcon *icon=0, 	 Qt::ItemFlags flags=(Qt::ItemFlags)63, QVariant data=QVariant())
		 * \brief Constructeur
		 * \param[in] numChamp Numéro du champ dans la table de la base de données
		 * \param[in] nomChamp Nom du champ dans la table de la base de données
		 * \param[in] titre Titre de la colonne
		 * \param[in] alignment Alignement dans la table
		 * \param[in] icon Image
		 * \param[in] flags Drapeau de configuration
		 * \param[in] data Donnée interne
		 */
		CColumnModelTime(	int numChamp, QString nomChamp, QString titre, Qt::Alignment alignment=Qt::AlignRight, 
							QIcon *icon=0, Qt::ItemFlags flags=(Qt::ItemFlags)63, QVariant data=QVariant());
		QString format(QString string) { return QTime::fromString(string, "hh:mm:ss").toString("hh:mm:ss"); }
		QString formatToSQL(QString string) { return "\""+QTime::fromString(string, "hh:mm:ss").toString("hh:mm:ss")+"\""; }
		QString formatFromSQL(QString string) { return QTime::fromString(string, "hh:mm:ss").toString("hh:mm:ss"); }
};
//------------------------------------------------------------------------------
#endif //__CCOLUMNMODEL_H__
//------------------------------------------------------------------------------